"""
Система для отправки сообщений администраторам бота.

Author: Milinuri Nirvalen
Ver: 1.4 (8)
"""

from chiori import Plugin
from chiori import fcheck

import os
import time
import traceback


p = Plugin(name='репорты')
reports_folder = 'data/reports/'

# func
# ####

def info():
	return f'''< - репорты - >
Репорты - способ отправить сообщение администратору бота.
Вы можете сообщить о вашей замечательной идеи, найденном вами баге или же отправить пожелание.
За хорошую работу вы будете вознаграждены.

📛 сейчас репортов: {len(os.listdir("data/reports/"))}
🔧 сейчас авторепортов: {len(os.listdir("data/reports/autoreports/"))}

справка:
/репорт [text] - отправить баг/идею/пожелание.'''


def send_report(text, event, reports_folder='data/reports'):
	report_id = len(os.listdir(reports_folder))
	while True:
		file_name = f'{reports_folder}/{report_id}.txt'
		if not os.path.exists(file_name):
			with open(file_name, 'w') as f:
				f.write(f'''*** report {report_id} ***
from: {event.get("from")}
to: {event.get("to")}
reply: {event.get("reply")}
att: {event.get("attachs")}
time: {time.ctime(event.get("date"))}
text: {event.get("text")}

report: {text}''')
			return f'📛 репорт {report_id} отправлен.'
			break
		else:
			report_id += 1
	p.log.log(f'репорт сохранён в: {file_name}')

# handlers
# ########

@p.eventHandler('init')
async def _(app):
	fcheck('data/reports', True)
	fcheck('data/reports/autoreports', True)


@p.eventHandler('except')
async def _(e, event, ctx):
	send_report(traceback.format_exc(), event, 'data/reports/autoreports')

# commands for admins
# ===================

@p.command('reports', 'арепорты', admins=True,
	usage='[id] посмотреть список репортов')
async def reportsList(event, ctx):
	if not ctx.args:
		text = f'список репортов:\n📛 сейчас репортов: {len(os.listdir(reports_folder))}\n'
		text += ', '.join([x.split('.')[0] for x in os.listdir(reports_folder)])
		await ctx.message(text)

	else:
		file_name = f'{reports_folder}/{ctx.sargs}.txt'
		if os.path.exists(file_name):
			with open(file_name) as f:
				await ctx.message(f.read())
		else:
			await ctx.message('📛 репорт не найден.')


@p.command('<del/rm report/reports>', admins=True,
	usage='[ids] удлить репорт(ы)')
async def delreport(event, ctx):
	text = 'удаление репортов:'

	for report_id in ctx.args:

		file_name = f'{reports_folder}/{report_id}.txt'

		if os.path.exists(file_name):
			os.remove(file_name)
			text += f'\n📛 репорт {report_id} удалён.'

		else:
			text += f'\n📛 репорт {report_id} не найден.'

	await ctx.message(text)


# user commands
# =============

@p.command('report', 'репорт', 'репорты', usage='отправить баг/илею/пожелание администратору.')
async def report(event, ctx):
	if ctx.sargs:
		await ctx.message(send_report(ctx.sargs, event))
	else:
		await ctx.message(info())
